package org.sothis.core.util; import java.security.SignatureException; import java.util.Arrays; import java.util.Map; import java.util.TreeMap; import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; import org.apache.commons.codec.binary.Hex; public class SignatureUtils { private static final String HMAC_SHA1_ALGORITHM = "HmacSHA1"; public static String sign(String secretKey, Map<String, String[]> requestParams) throws SignatureException { Map<String, String[]> sortedRequestParams = new TreeMap<String, String[]>(requestParams); StringBuilder dataString = new StringBuilder(); for (Map.Entry<String, String[]> entry : sortedRequestParams.entrySet()) { dataString.append(entry.getKey()); String[] sortedValues; if (entry.getValue().length <= 1) { sortedValues = entry.getValue(); } else { sortedValues = new String[entry.getValue().length]; System.arraycopy(entry.getValue(), 0, sortedValues, 0, sortedValues.length); Arrays.sort(sortedValues); } for (String value : sortedValues) { dataString.append(value); } } return sign(secretKey, dataString.toString()); } public static String sign(String secretKey, String data) throws SignatureException { try { SecretKeySpec signingKey = new SecretKeySpec(secretKey.getBytes(), HMAC_SHA1_ALGORITHM); Mac mac = Mac.getInstance(HMAC_SHA1_ALGORITHM); mac.init(signingKey); byte[] rawHmac = mac.doFinal(data.getBytes()); return Hex.encodeHexString(rawHmac); } catch (Exception e) { throw new SignatureException("Failed to generate HMAC : " + e.getMessage()); } } }